# -*- coding: utf-8 -*-
# @version        : 1.0
# @Creaet Time    : 2021/10/18 10:58
# @File           : case06.py
# @IDE            : PyCharm
# @desc           : 案例06，数据库操作


"""
FastAPI 使用了一种常见的模式 ORM（对象关系映射工具），可与任何形式的数据库进行通信。

ORM 具有在代码表和数据库表之间进行转换的工具。ORM 就是 Object Relational Mapper 的简写，就是关系对象映射器的意思。
通过 ORM 我们可以通过类的方式去操作数据库，而不用再写原生的SQL语句。通过把表映射成类，把数据行作为类实例，把数据字段作为类属性，我们通常把这个类 称为 模型，即 ORM 模型
ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
使用 ORM 有许多优点：
- 易用性：使用ORM做数据库的开发可以有效的减少重复SQL语句的概率，写出来的模型也更加直观、清晰。
- 性能损耗小：ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看，这种性能损耗很少（不足5%），只要不是对性能有严苛的要求，综合考虑开发效率、代码的阅读性，带来的好处要远远大于性能损耗，而且项目越大作用越明显。
- 设计灵活：可以轻松的写出复杂的查询。
- 可移植性：Django封装了底层的数据库实现，支持多个关系数据库引擎，包括流行的MySQL、PostgreSQL和SQLite。可以非常轻松的切换数据库。

常见的 ORM 例如：Django-ORM（Django 框架的一部分），SQLAlchemy ORM（SQLAlchemy 的一部分，独立于框架）和 Peewee（独立于框架），等等。

在这里，FastAPI 主要使用的是 SQLAlchemy ORM。

在此示例中，我们将使用 SQLite，因为它使用单个文件并且 Python 集成了支持。因此，您可以复制此示例并按原样运行它。

信息：
有一个官方的项目生成器，带有 FastAPI 和 PostgreSQL，它们都基于 Docker，包括前端和更多工具：
https://github.com/tiangolo/full-stack-fastapi-postgresql

对于 SQLAlchemy ORM 示例 我们需要在项目根目录单独新建一个 package 其结构如下：
.
└── sql_app
    ├── __init__.py
    ├── crud.py
    ├── database.py
    ├── main.py
    ├── models.py
    └── schemas.py

依次更改：

- database.py：SQLAlchemy 部分，基本映射类（ORM 模型基类），数据库会话（SessionLocal）
- models.py：存储 ORM 模型文件，这些 ORM 模型会映射为数据库表
- schemas.py：存储 pydantic 模型文件，用于序列化模型
- crud.py：存储数据库增删改查操作函数
- main.py：提供数据库增删改查操作的接口路由函数


信息：
您还可以使用在线SQLite浏览器：
SQLite Viewer：https://inloop.github.io/sqlite-viewer/
ExtendsClass：https://extendsclass.com/sqlite-browser.html
或者可以使用 Navicat 数据库管理工具
"""


from fastapi import APIRouter

case06 = APIRouter()


@case06.get("/", summary="案例6初始接口")
def case06_root():
    return "case06_root"